//
// Created by 49647 on 2022/7/24.
//
#include <type_traits>
#include <string>

// c++ 11
//template<typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
//std::string ToString(T t) {
//    printf("version 1\n");
//    return std::to_string(t);
//}
//
//template<typename T, typename std::enable_if<!std::is_integral<T>::value, bool>::type = true>
//std::string ToString(T t) {
//    printf("version 2\n");
//    return t;
//}

// c++ 17
//template<typename T, typename std::enable_if_t<std::is_integral_v<T>, bool> = true>
//std::string ToString(T t) {
//    printf("version 1\n");
//    return std::to_string(t);
//}
//
//template<typename T, typename std::enable_if_t<!std::is_integral_v<T>, bool> = true>
//std::string ToString(T t) {
//    printf("version 2\n");
//    return t;
//}

// c++ 17
template<typename T>
std::string ToString(T t) {
    if constexpr(std::is_integral_v<T>) {
        printf("version 1\n");
        return std::to_string(t);
    } else {
        printf("version 2\n");
        return t;
    }
}

int main() {
    ToString(20);
    ToString("haha");
}